package svc

import (
	"github.com/casbin/casbin/v2"
	gormadapter "github.com/casbin/gorm-adapter/v3"
	"github.com/zeromicro/go-zero/core/logx"
	"github.com/zeromicro/go-zero/core/stores/sqlx"
	"gorm.io/gorm"

	"probe-users/internal/config"
	"probe-users/internal/errorx"
	"probe-users/internal/model"
)

type ServiceContext struct {
	Config    config.Config
	DB        *gorm.DB
	Enforcer  *casbin.Enforcer
	UserModel model.UserModel
	RoleModel model.RoleModel
}

func NewServiceContext(c config.Config) *ServiceContext {
	// 初始化Gorm
	db, err := model.InitGorm(c.Mysql.DataSource)
	if err != nil {
		logx.Errorf("%w: 初始化数据库失败: %v", errorx.ErrDBInitFailed, err)
	}

	// 初始化Casbin
	adapter, err := gormadapter.NewAdapterByDB(db)
	if err != nil {
		logx.Errorf("%w: 初始化Casbin适配器失败: %v", errorx.ErrCasbinInitFailed, err)
	}

	enforcer, err := casbin.NewEnforcer(c.Casbin.ModelPath, adapter)
	if err != nil {
		logx.Errorf("%w: 初始化Casbin失败: %v", errorx.ErrCasbinInitFailed, err)
	}

	// 加载策略
	if err := enforcer.LoadPolicy(); err != nil {
		logx.Errorf("%w: 加载Casbin策略失败: %v", errorx.ErrCasbinLoadPolicyFailed, err)
	}

	// 检查策略是否为空（首次启动时为空）
	// policy, err := enforcer.GetPolicy()
	// if err != nil {
	// 	logx.Errorf("%w: 获取Casbin策略失败: %v", errorx.ErrCasbinGetPolicyFailed, err)
	// }
	// if len(policy) == 0 {
	// 	// 从PolicyPath指定的文件加载初始策略
	// 	if err := enforcer.LoadPolicyFromFile(c.Casbin.PolicyPath); err != nil {
	// 		logx.Errorf("%w: 从文件加载初始策略失败: %v", errorx.ErrCasbinLoadPolicyFailed, err)
	// 	}
	// 	// 将初始策略写入数据库（通过适配器）
	// 	if err := enforcer.SavePolicy(); err != nil {
	// 		logx.Errorf("%w: 保存初始策略到数据库失败: %v", errorx.ErrCasbinSavePolicyFailed, err)
	// 	}
	// 	logx.Infof("已从%s加载初始策略并写入数据库", c.Casbin.PolicyPath)
	// }

	// 初始化模型
	sqlConn := sqlx.NewMysql(c.Mysql.DataSource)
	userModel := model.NewUserModel(sqlConn, c.Cache)
	roleModel := model.NewRoleModel(sqlConn, c.Cache)

	return &ServiceContext{
		Config:    c,
		DB:        db,
		Enforcer:  enforcer,
		UserModel: userModel,
		RoleModel: roleModel,
	}
}
